﻿#pragma once

#include <memory>

template <typename T>
using Ref = std::shared_ptr<T>;

template <typename T>
using WeakRef = std::weak_ptr<T>;

template <typename T>
using Scoped = std::unique_ptr<T>;

template <typename T, typename... Args>
Ref<T> CreateRef(Args &&...args) { return std::make_shared<T>(std::forward<Args>(args)...); }

template <typename T, typename... Args>
WeakRef<T> CreateWeakRef(Args &&...args) { return std::make_shared<T>(std::forward<Args>(args)...); }

template <typename T, typename... Args>
Scoped<T> CreateScoped(Args &&...args) { return std::make_unique<T>(std::forward<Args>(args)...); }
